package persistencia;
import java.util.List;
import java.io.*;

import logica.clases.Pais;
import logica.colecciones.Limites;
import logica.colecciones.Mapa;
import logica.colecciones.Fronteras;
import persistencia.PersistenciaException;
import logica.datatypes.Pais.DataLimite;
import logica.clases.Coordenada;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Properties;
import java.io.StreamTokenizer;
import java.io.Serializable;

public class Archivo implements Serializable{
	private final static long serialVersionUID = 1;

	private String rutaPaises;
	private String rutaFronteras;
	private static Archivo instancia;
	
	
	private Archivo(){
		rutaPaises = new String("ObtenerPaisesDe");
		rutaFronteras = new String("ObtenerFronterasDe");
		
	}
	
	public static Archivo getInstancia(){
		if (instancia == null)
			instancia = new Archivo();
		return instancia;
	}
	
	public static Mapa recuperarPaises() throws PersistenciaException {
		
		try {
			Config conf = Config.getInstancia();
			Archivo rutaArchivo = Archivo.getInstancia();
			String rutaP = conf.getArchivoConf(rutaArchivo.getRutaPaises()); 
			
			Mapa mapa = new Mapa();
			int num,x,y;
			String nom;

			FileReader in = new FileReader(rutaP);
			StreamTokenizer st = new StreamTokenizer(in);

			while(st.nextToken() != StreamTokenizer.TT_EOF) {

				num = (int)st.nval;
				st.nextToken();
				nom = st.sval;
				st.nextToken();
				x = (int)st.nval;
				st.nextToken();
				y = (int)st.nval;

				Coordenada Coordenada = new Coordenada(x,y);
				Pais pais = new Pais(num,nom,Coordenada);
				mapa.insert(pais);
				
			}

			return mapa;			
			
		}catch (IOException e) {
			throw new PersistenciaException(e.getMessage(),3);
		}
	}
	
	public static void recuperarFronteras() throws PersistenciaException {
		
		try {
			Config conf = Config.getInstancia();
			Archivo rutaArchivo = Archivo.getInstancia();
			String rutaF = conf.getArchivoConf(rutaArchivo.getRutaFronteras()); 
			
			
			ArrayList<DataLimite> listLimites = new ArrayList<DataLimite>();
			
			int pais,lim;
			FileReader in = new FileReader(rutaF);
			StreamTokenizer st = new StreamTokenizer(in);

			while(st.nextToken() != StreamTokenizer.TT_EOF) {
				
				pais = (int)st.nval;
				st.nextToken();
				lim = (int)st.nval;

				DataLimite dataLimite = new DataLimite(pais,lim);
				listLimites.add(dataLimite);

			}
			
			int cant = listLimites.size();
		
			Limites fronteras[] = new Limites[cant];
			for (int i = 0; i < cant; i++) {
				List<Integer> limites = new ArrayList<Integer>();
				fronteras[i] = new Limites(limites); 
			}
			for (int i=0; i<cant; i++){
				Integer codigoPais , codigoPaisVecino;
				codigoPais = (Integer)listLimites.get(i).getPais();
				codigoPaisVecino = (Integer) listLimites.get(i).getLimite();
				if (!fronteras[codigoPais].member(codigoPaisVecino))
					fronteras[codigoPais].insert(codigoPaisVecino);
				if (!fronteras[codigoPaisVecino].member(codigoPais))
					fronteras[codigoPaisVecino].insert(codigoPais);
			}

			Fronteras.getInstancia().setFronteras(fronteras);

		} catch (IOException e) {
			throw new PersistenciaException(e.getMessage(),4);
		}
	}
	public String getRutaPaises() {
		return rutaPaises;
	}

	public String getRutaFronteras() {
		return rutaFronteras;
	}
	
}
